/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aprendizajePorRefuerzo.entorno;

import aprendizajePorRefuerzo.accion.Accion;
import aprendizajePorRefuerzo.estado.Estado;
import aprendizajePorRefuerzo.reward.RewardImp;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 *
 * @author Fernando Sorzana
 */
public class EntornoClimb implements Entorno{
    
    private Estado top = new EstadoClimb(false);
    
    private Estado bottom = new EstadoClimb(false);
    
    private Accion climb = new Accion(){};
    
    private Accion rest = new Accion(){};
    
    public List<Accion> getAccionesPosibles(){
        List<Accion> acciones = new ArrayList<>();
        acciones.add(climb);
        acciones.add(rest);
        return acciones;
    }

    @Override
    public RespuestaEntorno devolverRespuesta(Estado estado, Accion accion) {
        if (estado == top){
            return new RespuestaEntorno(new RewardImp(1.0), bottom);
        } else {
            if (accion == climb){
                return new RespuestaEntorno(new RewardImp(0.0), top);
            } else {
                return new RespuestaEntorno(new RewardImp(0.1),bottom);
            }
        }
    }
    
    public Estado getInicial(){
        return bottom;
    }

    @Override
    public List<Estado> getEstados() {
        List<Estado> estados = new ArrayList<>();
        estados.add(top);
        estados.add(bottom);
        return estados;
    }
    
    public class EstadoClimb implements Estado {
        
        private boolean esFinal;

        public EstadoClimb(boolean esFinal) {
            this.esFinal = esFinal;
        }

        public boolean isEsFinal() {
            return esFinal;
        }

        public void setEsFinal(boolean esFinal) {
            this.esFinal = esFinal;
        }

        @Override
        public boolean esFinal() {
            return esFinal;
        }
        
    }
    
}
